#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>

typedef struct msg {
    long int msgtype;
    char msg[BUFSIZ];
} msg_t;

int main(int argc, char *argv[]) {
    msg_t msg;
    int msgkey = 0;
    long int msgtype = 0;
    int msgid = -1;

    if (argc != 3) {
        printf("error: invalid argument!\n");
        printf("usage: <app> <msgid> <msgtype>\n");
        exit(EXIT_FAILURE);
    }

    msgkey = atoi(argv[1]);
    msgtype = (long int)atoi(argv[2]);

    msgid = msgget((key_t)msgkey, 0666 | IPC_CREAT);
    if (msgid == -1) {
        fprintf(stderr, "msgget failed with error: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    while (1) {
        if (msgrcv(msgid, (void *)&msg, BUFSIZ, msgtype, 0) == -1) {
            fprintf(stderr, "msgrcv failed with error: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        printf("Receive message: %s", msg.msg);

        if (!strncmp(msg.msg, "end", 3)) {
            if (msgctl(msgid, IPC_RMID, NULL) == -1) {
                fprintf(stderr, "msgctl(IPC_RMID) failed with error: %s\n", strerror(errno));
                exit(EXIT_FAILURE);
            }

            break;
        }
    }

    exit(EXIT_SUCCESS);
}
